package com.nature.yanglegeyangultimate.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.awt.image.BufferedImage;
import java.io.UnsupportedEncodingException;
import java.util.stream.Collectors;

/**
 * 本类用于外部资源的读取和加载操作
 * 主要目的是用于加载图片资源和音频资源
 */
public class ReadResourcesUtil {

    //创建一个随机数生成器对象
    private static final Random random = new Random();
    //皮肤总数常量
    private static final int SKIN_NUMBER = 109;
    //音频总数常量
    private static final int AUDIO_NUMBER = 2;
    //控制是否随机的常量属性（单刀n掷开关）
    private static final boolean IS_RANDOM = true;

    static File jarFile;

    static {
        try {
            // 创建一个File对象，代表当前类所在的jar文件
            // 使用URLDecoder.decode解码类代码基的URL，以处理可能存在的特殊字符
            // 使用UTF-8字符集进行解码，确保兼容性并避免中文路径名乱码问题
            jarFile = new File(java.net.URLDecoder.decode(ReadResourcesUtil.class.getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8"));
            System.out.println(jarFile);
        } catch (UnsupportedEncodingException e) {
            System.out.println(e.getMessage());
        }
    }

    //使用类加载器
    private static final ClassLoader classLoader = ReadResourcesUtil.class.getClassLoader();

    //作为一个工具类，不允许创建对象
    private ReadResourcesUtil() {
        System.out.println("资源加载工具类加载成功");
    }

    /**
     * 随机完成之后，直接播放失败音频音频
     */
    public static void playAudioFail() {
        String audioPath = getAudioPath(IS_RANDOM);
        playAudio(audioPath);
    }

    /**
     * 两套语音系统的点击音效都是一致的，所以直接写死
     */
    public static void playAudioClick() {
        playAudio("static/audio/wav0/click.wav");
    }

    /**
     * 两套语音系统的胜利音效都是一致的，所以直接写死
     */
    public static void playAudioWin() {
        playAudio("static/audio/wav0/win.wav");
    }

    /**
     * 随机完成之后，直接读取图片，返回一个读取图片的对象集合
     *
     * @return 读取的图像的对象集合
     */
    public static List<BufferedImage> readImage() {
        //获取随机的图片路径集合
        List<String> imagePath = getImagePath(IS_RANDOM);
        //创建最后要返回的集合对象
        return imagePath.stream().map(ReadResourcesUtil::readImage).collect(Collectors.toList());
    }

    /**
     * 随机获取要播放的音频路径
     *
     * @param isRandom 是否随机
     * @return 音频路径变量
     */
    public static String getAudioPath(boolean isRandom) {
        int index = 1;
        //判断是否需要随机获取图品的路径
        if (isRandom) {
            //随机一个要渲染的皮肤序号
            index = random.nextInt(AUDIO_NUMBER);
        }
        return "static/audio/wav" + index + "/fail.wav";
    }

    /**
     * 随机获取要渲染的皮肤的路径集合
     *
     * @param isRandom 是否需要随机
     * @return 图片路径集合
     */
    public static List<String> getImagePath(boolean isRandom) {
        int index = 2;
        if (isRandom) {
            index = random.nextInt(SKIN_NUMBER);
        }

        List<String> imagePathList = new ArrayList<>();
        int count = 0;

        while (true) {
//            URL resource = classLoader.getResource("static/skins/a" + index + "/" + count + ".png");
            File resource = new File("static/skins/a" + index + "/" + count + ".png");

            if (!resource.exists()) {
                break;
            }
            System.out.println(resource);
            imagePathList.add(resource.getAbsolutePath());
            count++;
        }
        return imagePathList;
    }


    /**
     * 使用缓冲图像流读取指定路径的图像数据
     *
     * @param imagePath 图像文件的路径
     * @return 读取到的 BufferedImage 对象
     */
    public static BufferedImage readImage(String imagePath) {
        try {
            File imageFile = new File(imagePath);
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            System.out.println(bufferedImage);
            return ImageIO.read(imageFile);
        } catch (IOException e) {
            //如果没有获取到对应的图片数据就打印对应的异常堆栈信息
            System.out.println(e.getMessage());
            return null;
        }
    }


    /**
     * 创建一个播放指定路径下的音频中的方法
     *
     * @param audioPath 目标音频路径
     */
    public static void playAudio(String audioPath) {
//        InputStream audioStream = classLoader.getResourceAsStream(audioPath);

        File audioFile = new File(audioPath);

//        if (audioStream == null) {
//            System.err.println("音频文件未找到: " + audioPath);
//            return;
//        }

        try (AudioInputStream audioIn = AudioSystem.getAudioInputStream(audioFile)) {
            Clip clip = AudioSystem.getClip();
            clip.open(audioIn);
            clip.start();

            // 确保音频对象加载完毕
            Thread.sleep(1);
            while (clip.isRunning()) {
                Thread.sleep(100);
            }

            // 关闭对象释放资源
            clip.close();
        } catch (Exception e) {
            System.err.println("播放音频时出错: " + e.getMessage());
        }
    }

}
